//============================================================================================
/**
 * @file	phclink_sel_sub.c
 * @brief	PHCポケモン選択アプリ	上画面
 * @author	Nozomu Saito
 *
 * モジュール名：PhcLnkSelSub_
 */
//============================================================================================
#include "phclink_sel_sub.h"

#include "application/poke_select.h"

#include "system/arc_util.h"
#include "system/gra_tool.h"
#include "system/clact_tool.h"

#include "strbuf_family.h"
#include "system/wordset.h"
#include "system/msgdata_util.h"
#include "system/fontproc.h"
#include "system/pmfprint.h"
#include "msgdata/msg.naix"
#include "phc_sel.naix"
#include "../../field/field_cutin.naix"

#include "msgdata/msg_phc_sel.h"


///BMPウィンドウ定義
///ニックネームウィンドウ
#define NAME_WIN_SX	(14)
#define NAME_WIN_SY	(6)
#define NAME_WIN_W		(8)
#define NAME_WIN_H		(2)
#define NAME_WIN_SIZE	( NAME_WIN_W*NAME_WIN_H )
#define NAME_WIN_BASE	(1)
///レベルウィンドウ
#define LV_WIN_SX	(24)
#define LV_WIN_SY	(6)
#define LV_WIN_W		(4)
#define LV_WIN_H		(2)
#define LV_WIN_SIZE	( LV_WIN_W*LV_WIN_H )
#define LV_WIN_BASE	(NAME_WIN_BASE+NAME_WIN_SIZE)
///性別ウィンドウ
#define SEX_WIN_SX	(22)
#define SEX_WIN_SY	(6)
#define SEX_WIN_W		(2)
#define SEX_WIN_H		(2)
#define SEX_WIN_SIZE	( SEX_WIN_W*SEX_WIN_H )
#define SEX_WIN_BASE	(LV_WIN_BASE+LV_WIN_SIZE)
///種族ウィンドウ
#define MONSNAME_WIN_SX	(14)
#define MONSNAME_WIN_SY	(9)
#define MONSNAME_WIN_W		(10)
#define MONSNAME_WIN_H		(2)
#define MONSNAME_WIN_SIZE	( MONSNAME_WIN_W*MONSNAME_WIN_H )
#define MONSNAME_WIN_BASE	(SEX_WIN_BASE+SEX_WIN_SIZE)
//「もちもの」ウィンドウ
#define ITEM_WIN_SX	(14)
#define ITEM_WIN_SY	(12)
#define ITEM_WIN_W		(8)
#define ITEM_WIN_H		(2)
#define ITEM_WIN_SIZE	( ITEM_WIN_W*ITEM_WIN_H )
#define ITEM_WIN_BASE	(MONSNAME_WIN_BASE+MONSNAME_WIN_SIZE)
///道具名ウィンドウ
#define ITEM_NAME_WIN_SX	(14)
#define ITEM_NAME_WIN_SY	(14)
#define ITEM_NAME_WIN_W		(16)
#define ITEM_NAME_WIN_H		(2)
#define ITEM_NAME_WIN_SIZE	( ITEM_NAME_WIN_W*ITEM_NAME_WIN_H )
#define ITEM_NAME_WIN_BASE	(ITEM_WIN_BASE+ITEM_WIN_SIZE)

#define	FONT_PALNO_NORMAL	15	/* ノーマルパレット */
#define FONT_PAL_OFS		( FONT_PALNO_NORMAL*32 )
#define	MSG_FONT_COLOR		(GF_PRINTCOLOR_MAKE( 1, 2, 0))
#define	MSG_FONT_COLOR_FEMALE	(GF_PRINTCOLOR_MAKE( 3, 4, 0))
#define	MSG_FONT_COLOR_MALE		(GF_PRINTCOLOR_MAKE( 7, 8, 0))

//--アクター関連
#define SUB_DISTANCE	(256*FX32_ONE)
//上画面リソース開始ナンバー
#define RES_NO_START	(1)		//共通下画面のリソース番号が０番

//セルアクター最大数
#define CELL_ACTOR_MAX			( 1+6 )
//↑ポケ+マーキング6
#define RES_NUM		(2)			//ポケスロン選択上画面リソースとポケグラリソース

#define POKE_X	(8*6)
#define POKE_Y	(11*8)

#define MARKING_BASE_X	(3*8)
#define MARKING_BASE_Y	(18*8)
#define MARKING_OFS	(8)

#define	UP_ANM_OFS			(4)
#define	DOWN_ANM_OFS		(5)

#define PRI_POKE	(0)
#define PRI_MARKING	(1)

#define POKE_GRA_CHR_ADR_OFS	( (32*4+8*6)*32 )
//↑上画面キャラ128+ポケモンステータスキャラ48のオフセット後、ポケグラキャラアドレスになっている（グラフィックデータ依存）
#define POKE_GRA_PAL_ADR_OFS	(32)
//↑パレット１本分オフセット後、ポケグラパレットアドレスになっている（グラフィックデータ依存）
#define POKE_GRA_CHR_SIZE	(100*32)		//10ｘ10
#define POKE_GRA_PAL_SIZE	(32)

typedef struct PHCLNK_SEL_SUB_ACT_tag
{
	int HeapID;

	CLACT_SET_PTR	ClactSet;				// セルアクターセット
	CLACT_U_EASYRENDER_DATA RendData;		// 簡易レンダーデータ
	CLACT_U_RES_MANAGER_PTR ResMan[CLACT_U_RES_MAX];	// リソースマネージャ

	CLACT_U_RES_OBJ_PTR ResObjTbl[RES_NUM][CLACT_U_RES_MAX];	// リソースオブジェテーブル
	CLACT_HEADER ClActHeader;

	CLACT_WORK_PTR Marking[MARKING_MAX];
	CLACT_WORK_PTR PokeAct;

	void *PokeChar;							///< ポケモン正面絵テクスチャ
	u16 PokePal[16];						///< パレットデータ
	u32 ImageVram;							///< VRAM転送先インデックス
	u32 PaletteVram;						///< パレットVRAM転送先インデックス
}PHCLNK_SEL_SUB_ACT;

typedef struct PHCLNK_SEL_SUB_tag
{
	int HeapID;						///< ヒープID
	GF_BGL_INI *bgl;				///< BGLポインタ
	GF_BGL_BMPWIN	MonsNameWin;	///< ポケモン名
	GF_BGL_BMPWIN	LvWin;			///< レベル
	GF_BGL_BMPWIN	ItemWin;		///< どうぐ
	GF_BGL_BMPWIN	NameWin;		///< 名前
	GF_BGL_BMPWIN	SexWin;			///< 性別
	GF_BGL_BMPWIN	ItemNameWin;	///< どうぐ名

	MSGDATA_MANAGER	*MsgMng;		///< メッセージデータマネージャー
	WORDSET			*WordSet;		///< ワードセット
	//ポケモンニックネーム
	STRBUF *NickName;				///< 取得したニックネーム名

	PHCLNK_SEL_SUB_ACT ActCnt;		///< セルアクターポインタ
}PHCLNK_SEL_SUB;

static void SetUpBG(GF_BGL_INI * ini, const int inHeapID);
static void BgInit(GF_BGL_INI * ini);
///static void DrawBmp(PSS_CNT_PTR ptr);
static void UpdateText(PLNKS_CNT_PTR ptr, const PLNKS_REDRAW_INFO* inReDrawInfo);
static void UpdateAct(PLNKS_CNT_PTR ptr, const PLNKS_REDRAW_INFO* inReDrawInfo);
static void VanishAct(PLNKS_CNT_PTR ptr);

//アクター関連
static void InitCellActor(PHCLNK_SEL_SUB_ACT *ptr);
static void SetActor(PHCLNK_SEL_SUB_ACT *ptr);
static CLACT_WORK_PTR AddAct(PHCLNK_SEL_SUB_ACT *ptr, u8 inResNo, u8 inActPri, u8 inBgPri, int inX, int inY, int inAnm, int inFlg);
static void MakeCLACT_ADD(CLACT_ADD *add, CLACT_SET_PTR	clactSet, CLACT_HEADER *header, const int inArea, const int inHeapID);
static void DeleteCellActor(PHCLNK_SEL_SUB_ACT *ptr);

static void AttouchPokeVramAdr( PHCLNK_SEL_SUB_ACT *ptr );
static void SetUpPokeAct(PHCLNK_SEL_SUB_ACT *ptr, const PLNKS_REDRAW_INFO* inReDrawInfo);
static void TransPokeGra( PHCLNK_SEL_SUB_ACT *ptr );

//--------------------------------------------------------------------------------------------
/**
 * @brief	メモリアロケーション
 *
 * @param	inheapID			ヒープID
 *
 * @return	PLNKS_CNT_PTR		コントローラポインタ
 */
//--------------------------------------------------------------------------------------------
PLNKS_CNT_PTR PhcLnkSelSub_Alloc(const int inHeapID)
{
	PLNKS_CNT_PTR ptr;
	int size;
	size = sizeof(PHCLNK_SEL_SUB);

	ptr = sys_AllocMemory(inHeapID, size);
	MI_CpuClear8(ptr, size);

	ptr->HeapID = inHeapID;
	ptr->ActCnt.HeapID = inHeapID;
	return ptr;
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	初期化
 *
 * @param	ptr				管理ポインタ
 * @param	inBGL			BGL
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PhcLnkSelSub_Init(PLNKS_CNT_PTR ptr, GF_BGL_INI *inBGL)
{
	//BGLセット
	ptr->bgl = inBGL;
	//ＢＧセットアップ
	SetUpBG(ptr->bgl, ptr->HeapID);

	// 種族名ウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->MonsNameWin), GF_BGL_FRAME1_S,
			     MONSNAME_WIN_SX, MONSNAME_WIN_SY, MONSNAME_WIN_W, MONSNAME_WIN_H,
				 FONT_PALNO_NORMAL, MONSNAME_WIN_BASE);
	// レベルウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->LvWin), GF_BGL_FRAME1_S,
			     LV_WIN_SX, LV_WIN_SY, LV_WIN_W, LV_WIN_H,
				 FONT_PALNO_NORMAL, LV_WIN_BASE);
	// 「もちもの」ウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->ItemWin), GF_BGL_FRAME1_S,
			     ITEM_WIN_SX, ITEM_WIN_SY, ITEM_WIN_W, ITEM_WIN_H,
				 FONT_PALNO_NORMAL, ITEM_WIN_BASE);
	// ニックネームウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->NameWin), GF_BGL_FRAME1_S,
			     NAME_WIN_SX, NAME_WIN_SY, NAME_WIN_W, NAME_WIN_H,
				 FONT_PALNO_NORMAL, NAME_WIN_BASE);
	// 性別ウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->SexWin), GF_BGL_FRAME1_S,
			     SEX_WIN_SX, SEX_WIN_SY, SEX_WIN_W, SEX_WIN_H,
				 FONT_PALNO_NORMAL, SEX_WIN_BASE);
	// 道具名ウィンドウ作成
	GF_BGL_BmpWinAdd(ptr->bgl, &(ptr->ItemNameWin), GF_BGL_FRAME1_S,
			     ITEM_NAME_WIN_SX, ITEM_NAME_WIN_SY, ITEM_NAME_WIN_W, ITEM_NAME_WIN_H,
				 FONT_PALNO_NORMAL, ITEM_NAME_WIN_BASE);

	//メッセージマネージャとワードセットの確保
	ptr->MsgMng = MSGMAN_Create(MSGMAN_TYPE_DIRECT, ARC_MSG, NARC_msg_phc_sel_dat, ptr->HeapID);
	ptr->WordSet = WORDSET_Create(ptr->HeapID);
	//ニックネームメモリ確保
	ptr->NickName = STRBUF_Create( MONS_NAME_SIZE+EOM_SIZE, ptr->HeapID );

	//セルアクター初期化・ポケモンアイコンパレット転送
	InitCellActor(&ptr->ActCnt);
	//アクターを作成
	SetActor(&ptr->ActCnt);

///	DrawBmp(ptr);

	//BG非表示
	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );
	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	リドロー
 *
 * @param	ptr				コントローラ
 * @param	inReDrawInfo	描画情報更新データ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PhcLnkSelSub_ReDraw(PLNKS_CNT_PTR ptr, const PLNKS_REDRAW_INFO* inReDrawInfo)
{
	if (inReDrawInfo->ReDraw == PLNKS_REDRAW_UPDATE){
		//アクター関連更新
		UpdateAct(ptr, inReDrawInfo);
		//テキスト情報更新
		UpdateText(ptr, inReDrawInfo);
		//BG表示
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_ON );
	}else{
		//アクター非表示
		VanishAct(ptr);
		//BG非表示
		GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );
	}
}
#if 0
//--------------------------------------------------------------------------------------------
/**
 * @brief	開始描画状態セット
 *
 * @param	ptr				コントローラ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PkthSelSub_SetFirstDraw(PSS_CNT_PTR ptr)
{
	//アクター非表示
	VanishAct(ptr);
	//BG非表示
	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG1, VISIBLE_OFF );
	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
	//ペン表示
	CLACT_SetDrawFlag(ptr->ActCnt.Pen, 1);
	//下メッセージ表示
	GF_BGL_BmpWinOn(&(ptr->MsgWin));
}
#endif
//--------------------------------------------------------------------------------------------
/**
 * @brief	描画関数
 *
 * @param	ptr			コントローラ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PhcLnkSelSub_Draw(PLNKS_CNT_PTR ptr)
{
	if(ptr->ActCnt.ClactSet!=NULL){
		CLACT_Draw( ptr->ActCnt.ClactSet );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	解放
 *
 * @param	ptr		コントローラ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PhcLnkSelSub_Free(PLNKS_CNT_PTR ptr)
{
	//メッセージマネージャ解放
	MSGMAN_Delete( ptr->MsgMng );
	//ワードセット解放
	WORDSET_Delete( ptr->WordSet );
	//ニックネーム解放
	STRBUF_Delete( ptr->NickName );

	//ウィンドウ削除
	GF_BGL_BmpWinDel(&ptr->MonsNameWin);
	GF_BGL_BmpWinDel(&ptr->LvWin);
	GF_BGL_BmpWinDel(&ptr->ItemWin);
	GF_BGL_BmpWinDel(&ptr->NameWin);
	GF_BGL_BmpWinDel(&ptr->SexWin);
	GF_BGL_BmpWinDel(&ptr->ItemNameWin);

///	GF_BGL_BGControlExit(ptr->bgl, GF_BGL_FRAME0_S);
	GF_BGL_BGControlExit(ptr->bgl, GF_BGL_FRAME1_S);
///	GF_BGL_BGControlExit(ptr->bgl, GF_BGL_FRAME2_S);
	GF_BGL_BGControlExit(ptr->bgl, GF_BGL_FRAME3_S);

	{
		u8 i;
		PHCLNK_SEL_SUB_ACT *act_cnt_ptr;
		act_cnt_ptr = &ptr->ActCnt;
		//アクター削除
		DeleteCellActor(act_cnt_ptr);
		for (i=0;i<RES_NUM;i++){
			// キャラ転送マネージャー破棄
			CLACT_U_CharManagerDelete(act_cnt_ptr->ResObjTbl[i][CLACT_U_CHAR_RES]);
			// パレット転送マネージャー破棄
			CLACT_U_PlttManagerDelete(act_cnt_ptr->ResObjTbl[i][CLACT_U_PLTT_RES]);
		}
		// キャラ・パレット・セル・セルアニメのリソースマネージャー破棄
		for(i=0;i<CLACT_U_RES_MAX;i++){
			CLACT_U_ResManagerDelete(act_cnt_ptr->ResMan[i]);
		}
		// セルアクターセット破棄
		CLACT_DestSet(act_cnt_ptr->ClactSet);
	}
	sys_FreeMemoryEz(ptr);
}

//------------------------------------------------------------------
/**
 * @brief	セルアクター削除
 *
 * @param	ptr		コントローラ
 *
 * @return	none
 */
//------------------------------------------------------------------
static void DeleteCellActor(PHCLNK_SEL_SUB_ACT *ptr)
{
	int i,j;

	//マーキング
	for (i=0;i<MARKING_MAX;i++){
		CLACT_Delete(ptr->Marking[i]);
	}
	//ポケグラ
	CLACT_Delete(ptr->PokeAct);

	sys_FreeMemoryEz( ptr->PokeChar );
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	BGセットアップ
 * @param	ini			BGL
 * @param	inHeapID	ヒープID
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void SetUpBG(GF_BGL_INI * ini, const int inHeapID)
{
	BgInit(ini);
	//BGパレット転送
	ArcUtil_PalSet(ARC_PHC_SUB_GRA, NARC_phc_sel_phc_sel_box_u_nclr, PALTYPE_SUB_BG, 0, 0, inHeapID);
	//BGキャラ転送
	ArcUtil_BgCharSet(ARC_PHC_SUB_GRA, NARC_phc_sel_phc_sel_box_u_lz_ccgr, ini,
			    GF_BGL_FRAME3_S, 0, 0, 1, inHeapID);
	//スクリーン転送
	ArcUtil_ScrnSet(ARC_PHC_SUB_GRA, NARC_phc_sel_phc_sel_box_u_lz_cscr, ini,
			  GF_BGL_FRAME3_S, 0, 32*24*2, 1, inHeapID);
	GF_BGL_LoadScreenReq(ini, GF_BGL_FRAME3_S);

	//フォントパレットロード
	SystemFontPaletteLoad( PALTYPE_SUB_BG, FONT_PAL_OFS, inHeapID);

	OS_Printf("bmpsize = %d\n",MONSNAME_WIN_SIZE+LV_WIN_SIZE+ITEM_WIN_SIZE+NAME_WIN_SIZE+ \
			SEX_WIN_SIZE+ITEM_NAME_WIN_SIZE);
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	BG初期化
 * @param	ini		BGL
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void BgInit(GF_BGL_INI * ini)
{
#if 0
	{	/* SUB DISP BG0 */				//書き直し不要テキスト面
    	GF_BGL_BGCNT_HEADER SBg0_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xe000, GX_BG_CHARBASE_0x00000,
      		GX_BG_EXTPLTT_01, 0, 0, 0, FALSE
    	};
    	GF_BGL_BGControlSet( ini, GF_BGL_FRAME0_S, &SBg0_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME0_S );
	}
#endif
	{	/* SUB DISP BG1 */
		GF_BGL_BGCNT_HEADER SBg1_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xe800, GX_BG_CHARBASE_0x00000,
      		GX_BG_EXTPLTT_01, 1, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( ini, GF_BGL_FRAME1_S, &SBg1_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME1_S );
	}
#if 0
	{	/* SUB DISP BG2 */
		GF_BGL_BGCNT_HEADER SBg2_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xf000, GX_BG_CHARBASE_0x08000,
      		GX_BG_EXTPLTT_23, 2, 0, 0, FALSE
    	};
    	GF_BGL_BGControlSet( ini, GF_BGL_FRAME2_S, &SBg2_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME2_S );
	}
#endif
	{	/* SUB DISP BG3 */
		GF_BGL_BGCNT_HEADER SBg3_Data = {
      		0, 0, 0x800, 0,
      		GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
      		GX_BG_SCRBASE_0xf800, GX_BG_CHARBASE_0x08000,
      		GX_BG_EXTPLTT_23, 3, 0, 0, FALSE
		};
		GF_BGL_BGControlSet( ini, GF_BGL_FRAME3_S, &SBg3_Data, GF_BGL_MODE_TEXT );
    	GF_BGL_ScrClear( ini, GF_BGL_FRAME3_S );
	}
}
#if 0
//--------------------------------------------------------------------------------------------
/**
 * @brief	BMPプリント
 * @param	ini		BGL
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void DrawBmp(PLNKS_CNT_PTR ptr)
{
	STRBUF * msg;
	//エキシビション
	msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_ex);
	GF_BGL_BmpWinDataFill(&(ptr->ExhibitionWin), MSG_FONT_COLOR);
	GF_STR_PrintColor(&(ptr->ExhibitionWin), FONT_SYSTEM, msg, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
	GF_BGL_BmpWinOn(&(ptr->ExhibitionWin));
	STRBUF_Delete(msg);
	//メッセージ
	msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_msg);
	GF_BGL_BmpWinDataFill(&(ptr->MsgWin), MSG_FONT_COLOR);
	GF_STR_PrintColor(&(ptr->MsgWin), FONT_SYSTEM, msg, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
	GF_BGL_BmpWinOn(&(ptr->MsgWin));
	STRBUF_Delete(msg);
	//パラメータ
	GF_BGL_BmpWinDataFill(&(ptr->ParamWin), MSG_FONT_COLOR);
	{
		//パワー
		msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_power);
		GF_STR_PrintColor(&(ptr->ParamWin), FONT_SYSTEM, msg, 0, 16*0, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
		STRBUF_Delete(msg);
		//スタミナ
		msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_stamina);
		GF_STR_PrintColor(&(ptr->ParamWin), FONT_SYSTEM, msg, 0, 16*1, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
		STRBUF_Delete(msg);
		//テクニック
		msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_technique);
		GF_STR_PrintColor(&(ptr->ParamWin), FONT_SYSTEM, msg, 0, 16*2, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
		STRBUF_Delete(msg);
		//ジャンプ
		msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_jump);
		GF_STR_PrintColor(&(ptr->ParamWin), FONT_SYSTEM, msg, 0, 16*3, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
		STRBUF_Delete(msg);
		//スピード
		msg = MSGMAN_AllocString(ptr->MsgMng, pkth_sel_speed);
		GF_STR_PrintColor(&(ptr->ParamWin), FONT_SYSTEM, msg, 0, 16*4, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
		STRBUF_Delete(msg);
	}
	GF_BGL_BmpWinOn(&(ptr->ParamWin));
}
#endif
//--------------------------------------------------------------------------------------------
/**
 * @brief	BMPプリント
 * @param	ptr			コントローラ
 * @param	ReDrawInfo	更新情報
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void UpdateText(PLNKS_CNT_PTR ptr, const PLNKS_REDRAW_INFO* inReDrawInfo)
{
	STRBUF *str;

	int integer = inReDrawInfo->Level;
	int item_no = inReDrawInfo->Item;
	//ニックネーム
	{
		STRBUF_SetStringCode( ptr->NickName, inReDrawInfo->NickName );
		GF_BGL_BmpWinDataFill( &ptr->NameWin, MSG_FONT_COLOR);
		GF_STR_PrintColor( 	&ptr->NameWin, FONT_SYSTEM, ptr->NickName, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR, NULL );
		GF_BGL_BmpWinOn(&ptr->NameWin);
	}
	//種族名
	{
		STRBUF *name;
		name = MSGDAT_UTIL_GetMonsName( inReDrawInfo->MonsNo, ptr->HeapID );
		WORDSET_RegisterWord( ptr->WordSet, 0, name, PM_NEUTRAL, TRUE, PM_LANG );
		STRBUF_Delete(name);
		str = MSGDAT_UTIL_AllocExpandString(ptr->WordSet, ptr->MsgMng, phc_sel_name, ptr->HeapID);
		GF_BGL_BmpWinDataFill(&(ptr->MonsNameWin), MSG_FONT_COLOR);
		GF_STR_PrintColor( 	&ptr->MonsNameWin, FONT_SYSTEM, str, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR, NULL );
		GF_BGL_BmpWinOn(&(ptr->MonsNameWin));
		STRBUF_Delete(str);
	}

	//レベル表示
	WORDSET_RegisterNumber(ptr->WordSet, 0, integer, 3,
				NUMBER_DISPTYPE_SPACE,NUMBER_CODETYPE_DEFAULT);
	str = MSGDAT_UTIL_AllocExpandString(ptr->WordSet, ptr->MsgMng, phc_sel_lv, ptr->HeapID);
	GF_BGL_BmpWinDataFill(&(ptr->LvWin), MSG_FONT_COLOR);
	GF_STR_PrintColor( 	&ptr->LvWin, FONT_SYSTEM, str, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR, NULL );
	GF_BGL_BmpWinOn(&(ptr->LvWin));
	STRBUF_Delete(str);

	//性別
	if (inReDrawInfo->Sex == PM_MALE){		//オス
		str = MSGMAN_AllocString(ptr->MsgMng, phc_sel_male);
		GF_BGL_BmpWinDataFill(&(ptr->SexWin), MSG_FONT_COLOR_MALE);
		GF_STR_PrintColor(&(ptr->SexWin), FONT_SYSTEM, str, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR_MALE, NULL);
		GF_BGL_BmpWinOn(&(ptr->SexWin));
		STRBUF_Delete(str);
	}else if (inReDrawInfo->Sex == PM_FEMALE){	//メス
		str = MSGMAN_AllocString(ptr->MsgMng, phc_sel_female);
		GF_BGL_BmpWinDataFill(&(ptr->SexWin), MSG_FONT_COLOR_FEMALE);
		GF_STR_PrintColor(&(ptr->SexWin), FONT_SYSTEM, str, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR_FEMALE, NULL);
		GF_BGL_BmpWinOn(&(ptr->SexWin));
		STRBUF_Delete(str);
	}else{
		GF_BGL_BmpWinDataFill(&(ptr->SexWin), MSG_FONT_COLOR);
		GF_BGL_BmpWinOn(&(ptr->SexWin));
	}

	//「もちもの」表示
	str = MSGMAN_AllocString(ptr->MsgMng, phc_sel_item);
	GF_BGL_BmpWinDataFill(&(ptr->ItemWin), MSG_FONT_COLOR);
	GF_STR_PrintColor(&(ptr->ItemWin), FONT_SYSTEM, str, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR, NULL);
	GF_BGL_BmpWinOn(&(ptr->ItemWin));
	STRBUF_Delete(str);

	//所持アイテム表示
	WORDSET_RegisterItemName( ptr->WordSet, 0, item_no );
	str = MSGDAT_UTIL_AllocExpandString(ptr->WordSet, ptr->MsgMng, phc_sel_item_name, ptr->HeapID);
	GF_BGL_BmpWinDataFill(&(ptr->ItemNameWin), MSG_FONT_COLOR);
	GF_STR_PrintColor( 	&ptr->ItemNameWin, FONT_SYSTEM, str, 0, 0, MSG_NO_PUT, MSG_FONT_COLOR, NULL );
	GF_BGL_BmpWinOn(&(ptr->ItemNameWin));
	STRBUF_Delete(str);
}


//アクター関連
//--------------------------------------------------------------------------------------------
/**
 * @brief	アクター関連更新
 * @param	ptr					コントローラ
 * @param	inReDrawInfo		更新情報
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void UpdateAct(PLNKS_CNT_PTR ptr, const PLNKS_REDRAW_INFO* inReDrawInfo)
{
	u8 i;
	PHCLNK_SEL_SUB_ACT *cnt_ptr = &ptr->ActCnt;

	SetUpPokeAct(&ptr->ActCnt, inReDrawInfo);
	TransPokeGra( &ptr->ActCnt );
	//ポケグラ
	CLACT_SetDrawFlag(ptr->ActCnt.PokeAct, 1);
	//マーキング
	{
		for (i=0;i<MARKING_MAX;i++){
			if ( inReDrawInfo->Marking[i]  ){
				CLACT_SetDrawFlag(cnt_ptr->Marking[i], 1);
				CLACT_AnmChg(cnt_ptr->Marking[i], (i*2)+1);
			}else{
				CLACT_SetDrawFlag(cnt_ptr->Marking[i], 1);
				CLACT_AnmChg(cnt_ptr->Marking[i], i*2);
			}
		}
	}
}

//--------------------------------------------------------------------------------------------
/**
 * @brief	アクター非表示
 * @param	ptr					コントローラ
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void VanishAct(PLNKS_CNT_PTR ptr)
{
	u8 i,j;
	PHCLNK_SEL_SUB_ACT *cnt_ptr = &ptr->ActCnt;

	//マーキング
	for (i=0;i<MARKING_MAX;i++){
		CLACT_SetDrawFlag(cnt_ptr->Marking[i], 0);
	}
	//ポケグラ
	CLACT_SetDrawFlag(cnt_ptr->PokeAct, 0);
}

//------------------------------------------------------------------
/**
 * @brief	セルアクターの初期化
 * @param	ptr		ワークポインタ
 * @return	NONE
 */
//------------------------------------------------------------------
static void InitCellActor(PHCLNK_SEL_SUB_ACT *ptr)
{
	int i;
	// セルアクター初期化
	ptr->ClactSet = CLACT_U_SetEasyInit( CELL_ACTOR_MAX, &ptr->RendData, ptr->HeapID);

	//サブ画面ディスタンス設定
	CLACT_U_SetSubSurfaceMatrix( &ptr->RendData, 0, SUB_DISTANCE );
	GF_Disp_GXS_VisibleControl(  GX_PLANEMASK_OBJ, VISIBLE_ON );	//サブ画面OBJ面ＯＮ

	//リソースマネージャー初期化
	for(i=0;i<CLACT_U_RES_MAX;i++){	//リソースマネージャー作成
		ptr->ResMan[i] = CLACT_U_ResManagerInit(RES_NUM, i, ptr->HeapID);
	}

	//---------PHC選択上画面-------------------
	//chara読み込み
	ptr->ResObjTbl[0][CLACT_U_CHAR_RES] =
		CLACT_U_ResManagerResAddArcChar(ptr->ResMan[CLACT_U_CHAR_RES],
					    ARC_PHC_SUB_GRA, NARC_phc_sel_phc_sel_mark_lz_ccgr,
					    1, RES_NO_START, NNS_G2D_VRAM_TYPE_2DSUB, ptr->HeapID);

	//pal読み込み
	ptr->ResObjTbl[0][CLACT_U_PLTT_RES] =
		CLACT_U_ResManagerResAddArcPltt(ptr->ResMan[CLACT_U_PLTT_RES],
					    ARC_PHC_SUB_GRA,  NARC_phc_sel_phc_sel_mark_nclr,
					    0, RES_NO_START, NNS_G2D_VRAM_TYPE_2DSUB, 4, ptr->HeapID);

	//cell読み込み
	ptr->ResObjTbl[0][CLACT_U_CELL_RES] =
		CLACT_U_ResManagerResAddArcKindCell(ptr->ResMan[CLACT_U_CELL_RES],
						ARC_PHC_SUB_GRA, NARC_phc_sel_phc_sel_mark_lz_ccer,
						1, RES_NO_START, CLACT_U_CELL_RES,ptr->HeapID);

	//同じ関数でanim読み込み
	ptr->ResObjTbl[0][CLACT_U_CELLANM_RES] =
		CLACT_U_ResManagerResAddArcKindCell(ptr->ResMan[CLACT_U_CELLANM_RES],
						ARC_PHC_SUB_GRA, NARC_phc_sel_phc_sel_mark_lz_canr,
						1, RES_NO_START, CLACT_U_CELLANM_RES,ptr->HeapID);
	// Chara転送
	CLACT_U_CharManagerSetAreaCont( ptr->ResObjTbl[0][CLACT_U_CHAR_RES] );
	// パレット転送
	CLACT_U_PlttManagerSet( ptr->ResObjTbl[0][CLACT_U_PLTT_RES] );

	//---------ポケグラ-------------------
	//chara読み込み
	ptr->ResObjTbl[1][CLACT_U_CHAR_RES] =
		CLACT_U_ResManagerResAddArcChar(ptr->ResMan[CLACT_U_CHAR_RES],
					    ARC_FIELD_CUTIN_GRA, NARC_field_cutin_poke_oam_NCGR,
					    0, RES_NO_START+1, NNS_G2D_VRAM_TYPE_2DSUB, ptr->HeapID);

	//pal読み込み
	ptr->ResObjTbl[1][CLACT_U_PLTT_RES] =
		CLACT_U_ResManagerResAddArcPltt(ptr->ResMan[CLACT_U_PLTT_RES],
					    ARC_FIELD_CUTIN_GRA, NARC_field_cutin_dp_boy01_NCLR,
					    0, RES_NO_START+1, NNS_G2D_VRAM_TYPE_2DSUB, 4, ptr->HeapID);

	//cell読み込み
	ptr->ResObjTbl[1][CLACT_U_CELL_RES] =
		CLACT_U_ResManagerResAddArcKindCell(ptr->ResMan[CLACT_U_CELL_RES],
						ARC_FIELD_CUTIN_GRA, NARC_field_cutin_poke_oam_NCER,
						0, RES_NO_START+1, CLACT_U_CELL_RES,ptr->HeapID);

	//同じ関数でanim読み込み
	ptr->ResObjTbl[1][CLACT_U_CELLANM_RES] =
		CLACT_U_ResManagerResAddArcKindCell(ptr->ResMan[CLACT_U_CELLANM_RES],
						ARC_FIELD_CUTIN_GRA, NARC_field_cutin_poke_oam_NCER,
						0, RES_NO_START+1, CLACT_U_CELLANM_RES,ptr->HeapID);
	// Chara転送
	CLACT_U_CharManagerSetAreaCont( ptr->ResObjTbl[1][CLACT_U_CHAR_RES] );
	// パレット転送
	CLACT_U_PlttManagerSet( ptr->ResObjTbl[1][CLACT_U_PLTT_RES] );
}

//------------------------------------------------------------------
/**
 * @brief	セルアクターセット
 * @param	ptr		ワークポインタ
 * @return	NONE
 */
//------------------------------------------------------------------
static void SetActor(PHCLNK_SEL_SUB_ACT *ptr)
{
	u8 i,j;
	//マーキング
	for (i=0;i<MARKING_MAX;i++){
		ptr->Marking[i] = AddAct(	ptr, RES_NO_START, PRI_MARKING, 0,
								MARKING_BASE_X+i*MARKING_OFS, MARKING_BASE_Y, i*2, 0	);
	}
	//ポケグラ
	ptr->PokeAct = AddAct(ptr, RES_NO_START+1, PRI_POKE, 0,
										POKE_X, POKE_Y, 0, 0);
	ptr->PokeChar = sys_AllocMemory(ptr->HeapID, POKE_TEX_SIZE);
	AttouchPokeVramAdr( ptr );
}

//------------------------------------------------------------------
/**
 * @brief	アクター追加
 *
 * @param	ptr				コントローラ
 * @param	inResNo			リソースナンバー
 * @param	inActPri		アクタープライオリティ
 * @param	inBgPri			BGプライオリティ
 * @param	inX				X座標
 * @param	inY				Y座標
 * @param	inAnm			アニメナンバー
 * @param	inFlg			表示フラグ
 *
 * @return	CLACT_WORK_PTR		アクターポインタ
 */
//------------------------------------------------------------------
static CLACT_WORK_PTR AddAct(	PHCLNK_SEL_SUB_ACT *ptr, u8 inResNo, u8 inActPri, u8 inBgPri,
								int inX, int inY, int inAnm, int inFlg	)
{
	CLACT_ADD add;
	CLACT_WORK_PTR p;

	CLACT_HEADER header;

	// セルアクターヘッダ作成
	CLACT_U_MakeHeader(&header, inResNo, inResNo, inResNo, inResNo, CLACT_U_HEADER_DATA_NONE, CLACT_U_HEADER_DATA_NONE,
			     0, inBgPri,
			     ptr->ResMan[CLACT_U_CHAR_RES],
				 ptr->ResMan[CLACT_U_PLTT_RES],
			     ptr->ResMan[CLACT_U_CELL_RES],
				 ptr->ResMan[CLACT_U_CELLANM_RES],
			     NULL,NULL);

	MakeCLACT_ADD(&add, ptr->ClactSet, &header, NNS_G2D_VRAM_TYPE_2DSUB, ptr->HeapID);

	add.mat.x = FX32_ONE * inX;
	add.mat.y = SUB_DISTANCE + (FX32_ONE * inY);
	add.pri   = inActPri;
	p = CLACT_Add(&add);
	CLACT_SetAnmFlag(p, 1);
	CLACT_AnmChg(p, inAnm);
	CLACT_BGPriorityChg(p, 1);
	CLACT_SetDrawFlag(p, inFlg);
	return p;
}

//------------------------------------------------------------------
/**
 * @brief	CLACT_ADDの雛形を作成
 *
 * @param	add			アクター追加構造体ポインタ
 * @param	ptr			アクターセットポインタ
 * @param	header		アクターヘッダー
 * @param	inArea		ドローエリア
 * @param	inHeapID	ヒープID
 *
 * @return	none
 */
//------------------------------------------------------------------
static void MakeCLACT_ADD(CLACT_ADD *add, CLACT_SET_PTR	clactSet, CLACT_HEADER *header, const int inArea, const int inHeapID)
{
  add->ClActSet		= clactSet;
  add->ClActHeader	= header;
  add->mat.z		= 0;
  add->sca.x		= FX32_ONE;
  add->sca.y		= FX32_ONE;
  add->sca.z		= FX32_ONE;
  add->rot		= 0;
  add->pri		= 0;
  add->DrawArea		= inArea;
  add->heap		= inHeapID;
}

//----------------------------------------------------------------------------
/**
 *	@brief	ＶＲＡＭアドレス割り当て
 *
 *	@param	ptr 				コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void AttouchPokeVramAdr( PHCLNK_SEL_SUB_ACT *ptr )
{
	CLACT_U_RES_OBJ_PTR res_obj_ptr;
	CLACT_U_RES_OBJ_PTR res_pal_ptr;
	NNSG2dImageProxy *image_proxy;
	const NNSG2dImagePaletteProxy *palette_proxy;

	res_obj_ptr = (ptr->ResObjTbl[1][CLACT_U_CHAR_RES]);
	res_pal_ptr = (ptr->ResObjTbl[1][CLACT_U_PLTT_RES]);

	image_proxy = CLACT_U_CharManagerGetProxy( res_obj_ptr );
	palette_proxy = CLACT_U_PlttManagerGetProxy( res_pal_ptr, image_proxy );

	ptr->ImageVram = NNS_G2dGetImageLocation( image_proxy, NNS_G2D_VRAM_TYPE_2DSUB );
	ptr->PaletteVram = NNS_G2dGetImagePaletteLocation( palette_proxy, NNS_G2D_VRAM_TYPE_2DSUB );
}

//----------------------------------------------------------------------------
/**
 *	@brief	アクターセットアップ
 *
 *	@param	ptr				アクターコントローラポインタ
 *	@param	inReDrawInfo 	更新情報
 *
 *	@return
 */
//-----------------------------------------------------------------------------
static void SetUpPokeAct(PHCLNK_SEL_SUB_ACT *ptr, const PLNKS_REDRAW_INFO* inReDrawInfo)
{
	SOFT_SPRITE_ARC sprite;
	PokeGraArcDataGet( &sprite, inReDrawInfo->MonsNo,
								inReDrawInfo->Sex,
								PARA_FRONT,
								inReDrawInfo->Rare,
								inReDrawInfo->Form,
								inReDrawInfo->PsnlRnd );

	Ex_ChangesInto_BattlePokeData(sprite.arc_no, sprite.index_chr, ptr->HeapID,
						ptr->PokeChar, inReDrawInfo->PsnlRnd, FALSE, PARA_FRONT, inReDrawInfo->MonsNo);
	{
		NNSG2dPaletteData	*pd;
		void*				buf;
		BOOL				ret;
		//パレットデータ読み込み
		buf = ArchiveDataLoadMalloc(sprite.arc_no, sprite.index_pal, ptr->HeapID);
		ret = NNS_G2dGetUnpackedPaletteData(buf,&pd);

		GF_ASSERT(ret==TRUE);

		MI_CpuCopy16(pd->pRawData, ptr->PokePal, 0x20);

		sys_FreeMemoryEz(buf);

	}
}

//----------------------------------------------------------------------------
/**
 *	@brief		ポケグラフィック転送
 *
 *	@param	ptr		コントローラ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void TransPokeGra( PHCLNK_SEL_SUB_ACT *ptr )
{
	int chr_trans_size;
	int plt_trans_size;

	chr_trans_size = (32*10)*10;	//32byte x10 y10
	plt_trans_size = 32;	//32byte


	DC_FlushRange(ptr->PokeChar,chr_trans_size);
	GXS_LoadOBJ( ptr->PokeChar, ptr->ImageVram, chr_trans_size );

	DC_FlushRange( ptr->PokePal, plt_trans_size );
	GXS_LoadOBJPltt( ptr->PokePal, ptr->PaletteVram, plt_trans_size );	//32byte 1Palette
}


